#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
// Bibliotecas IPC
#include <sys/types.h>
#include <unistd.h>
// Clases propias
#include "../IPC/Semaphore/Semaphore.h"
#include "../IPC/SharedMemory/ControlDataSharedMemory.h"
#include "../IPC/MessageQueue/DoorInputMessageQueue.h"
#include "../IPC/MessageQueue/DoorOutputMessageQueue.h"

class API {

private:
	Semaphore semControl;
	Semaphore semDoor;
	ControlDataSharedMemory shMem;

	DoorInputMessageQueue entryDoorQueueInput;
	DoorOutputMessageQueue entryDoorQueueOutput;
	DoorInputMessageQueue exitDoorQueueInput;
	DoorOutputMessageQueue exitDoorQueueOutput;
	
	// Buffer para escribir mensajes tanto para enviar, como para mostrar
	// por pantalla
	char buffer[255];

public:

	API();

	virtual ~API();
	
	// 
	bool entrarAMuseo(long idPersona, int nroPuerta);
	
	// 
	bool salirDeMuseo(long idPersona, int nroPuerta);

	/**************************************************************************/

	// Función utilizada por las puertas para enviar mensajes
	bool enviarMensajePuertaEntrada(int nroPuerta, long idPersona);
	
	// Función utilizada por las puertas para recibir mensajes. El identificador
	// del mensaje es una constante definida. Se la define como un parámetro
	// para darle flexibilidad al programa
	bool recibirMensajePuertaEntrada(int nroPuerta, long *idPersona);
	
	bool enviarMensajePuertaSalida(int nroPuerta, long idPersona);
	
	bool recibirMensajePuertaSalida(int nroPuerta, long *idPersona);
	
	// Función llamada por la puerta de entrada para permitir que una persona
	// entre al museo
	bool reservarEspacioParaUnaPersona(int nroPuerta);
	
	// Función llamada por la puerta de salida para permitir que personas
	// salgan del museo
	bool liberarEspacioDeUnaPersona(int nroPuerta);
};


	
	 
  
